(function() {

	var special = jQuery.event.special, uid1 = 'D' + (+new Date()), uid2 = 'D'
			+ (+new Date() + 1);

	special.scrollstart = {
		setup : function() {

			var timer, handler = function(evt) {

				var _self = this, _args = arguments;

				if (timer) {
					clearTimeout(timer);
				} else {
					evt.type = 'scrollstart';
					jQuery.event.handle.apply(_self, _args);
				}

				timer = setTimeout(function() {
							timer = null;
						}, special.scrollstop.latency);

			};

			jQuery(this).bind('scroll', handler).data(uid1, handler);

		},
		teardown : function() {
			jQuery(this).unbind('scroll', jQuery(this).data(uid1));
		}
	};

	special.scrollstop = {
		latency : 300,
		setup : function() {

			var timer, handler = function(evt) {

				var _self = this, _args = arguments;

				if (timer) {
					clearTimeout(timer);
				}

				timer = setTimeout(function() {

							timer = null;
							evt.type = 'scrollstop';
							jQuery.event.handle.apply(_self, _args);

						}, special.scrollstop.latency);

			};

			jQuery(this).bind('scroll', handler).data(uid2, handler);

		},
		teardown : function() {
			jQuery(this).unbind('scroll', jQuery(this).data(uid2));
		}
	};

})();